MonsterShelf is in the public domain.  Feel free to use it, send it to your friends, and extend it.  If you'd like to send me feedback, you can reach me at bp@cs.washington.edu.  Requests for features or bug fixes are always more likely to make it into the next version if they're accompanied by code!

First, a bit of history.  I wrote MonsterShelf about two and half years ago when I was at NeXT.  This app never made it outside NeXT.  Since I'm no longer working for NeXT, I re-wrote MonsterShelf, made it faster, added a ton of useful features, and made it simpler to use.  Throughout its lifetime, MonsterShelf has had the best critics I can imagine: the employees of NeXT.  Many folks have helped to make it what it is now.  Thanks!

Here's a rough overview of how MonsterShelf works.

The main view, called the ShelfView, occupies the whole screen.  It's in a window that's ordered in back of all other windows, with a really low window level.  The ShelfView manages all of the dragging and positioning of icons.  It is also responsible for managing the shelf file (~/.MonsterShelf).  A simple Controller object handles initialization and the two panels.

Each icon is represented on the screen by an IconView.  IconViews know alot about drawing, and not much else.  They can draw an icon with text below it, they know how to display a selected icon, and how to display themselves as a ghost.  They also keep track of the file name associated with the icon.  When an icon is dragged from the Workspace, an IconView is created, and displayed in the appropriate grid position if the grid is enabled.

IconViews are perhaps most notable for what they don't know how do to: dragging!  The dragging is handled by a subclass of IconView, called IconDragView.  When an icon is dropped on MonsterShelf, the IconView that was created during the dragging is turned into an IconDragView.  IconDragView knows how to initiate a drag, and knows how to accept other icons.  It also knows what to do when it's double clicked upon.

Brian Pinkerton
bp@cs.washington.edu
9/9/93